package tp.pr5.mv.instructions.jump;

import tp.pr5.mv.Instruction;
import tp.pr5.mv.Memory;
import tp.pr5.mv.OperandStack;
import tp.pr5.mv.ProgramCounter;
import tp.pr5.mv.inout.InMethod;
import tp.pr5.mv.inout.OutMethod;
import tp.pr5.mv.instructions.OneParamInstructions;
import tp.pr5.mv.traps.MVTrap;
import tp.pr5.mv.traps.WithoutOperandsEx;

public abstract class ConditionalJumps extends OneParamInstructions {
	
	// Esta clase implementará las instrucciones en las que el salto dependa de una condición.
	
	public void execute ( OperandStack stack, Memory mem, ProgramCounter pc, InMethod inMethod, OutMethod outMethod) throws MVTrap {
		
		if ( stack.isEmpty() )    // Necesitamos al menos un operando en la pila.
			throw new WithoutOperandsEx( this, stack.getCounter() );
		
		
		int a = stack.top();       // Sacamos la cima de la pila.
		stack.pop();
		
		analyzeAndJump( a, pc );
		
	}
	
	public abstract void analyzeAndJump ( int a, ProgramCounter pc );     // Este método implementa el salto dependiendo de la instrucción y del valor de a.

	public abstract Instruction create ( int par );
	
}
